Sistema de Nombrado en Java (JNDI) [Parte I]

Recordamos que un nombre mixto es un nombre que expande varios sistemas de nombres. Aqu� tenemos un ejemplo de un nombre mixto.

cn=homedir,cn=Jon Ruiz,ou=People/tutorial/report.txt

Esta es la representaci�n string de un nombre mixto que contiene dos partes: un nombre LDAP, "cn=homedir,cn=Jon Ruiz,ou=People", y un nombre de fichero, "tutorial/report.txt". cuando pasamos este string a un m�todo de Context, como lookup(), en el espacio de nombres configurado segun las recomendaciones de este tutorial (ver la lecci�n Preparaciones), el m�todo resolver� a trav�s del directorio LDAP al sistema de ficheros y devolver� el objeto destino (un fichero). El mecanismo de c�mo se consigue esto mediante las implementaciones subyacentes del proveedor de servicio se describe en la lecci�n Federaci�n.

Aqu� tenemos un ejemplo.

File f = (File)ctx.lookup(
    "cn=homedir,cn=Jon Ruiz,ou=People/tutorial/report.txt");

.�Representaci�n String

Un nombre mixto est� compuesto por componentes. Podemos pensar en un componente como en un segmento del nombre mixto que pertenece a un s�lo sistema de nombres. Cada compontente est� separado por un barra inclinada ("/").

Por ejemplo, el nombre.

cn=homedir,cn=Jon Ruiz,ou=People/tutorial/report.txt

tiene tres componentes.

cn=homedir,cn=Jon Ruiz,ou=People
tutorial
report.txt

El primer componente pertenece al espacio de nombres LDAP, y el segundo pertenece al espacio de nombres de sistema de ficheros. Como podemos ver de este ejemplo, se permiten varios componentes del mismo espacio de nombres ("tutorial" y "report.txt" son del espacio de nombres del sistema de ficheros), pero un componente no puede expandirse a m�s de un espacio de nombres (ver la explicaci�n en la lecci�n Federaci�n.)

Adem�s de los caracteres de la barra inclinada, la s�ntaxis de nombres mixtos tambi�n permite otros caracteres especiales: la barra inclinada invertida ("\"), la comilla simple ("'"), y las comillas ("""). Estos caracteres se llaman metacaracteres, lo que significa que tienen un significado especial cuando aparecen en un nombre mixto. El caracter de barra invertida es el caracter de escape. cuando el caracter de escape precede a un caracter meta, el caracter meta se trata literalmente y no se interpreta de acuerdo a su significado especial. Por ejemplo, en el string a\/b, la barra inclinada es escapada por el caracter de escape (barra invertida) y por lo tanto no es tratada como un separador de nombre de componente. Puedes ver la secci�n Manejar Caracteres Especiales de esta lecci�n para m�s detalles sobre los caracteres especiales.

Las comillas se proporcionan para que podamos usar los metacaracteres dentro de un componente de nombre mixto sin tener que escaparlos. Cuando un componente est� entre comillado, el primer y �ltimo caracter deben ser (el mismo) caracte de comilla. Un caracter de comilla simple debe corresponder con otro caracter de comilla simple, etc. Aqu� tenemos tres ejemplos del mismo componente escrito usando caracteres de escape y comillas.

a\/b\/c\/d
"a/b/c/d"
'a/b/b/d'

Se permtien dos caracteres de comillas diferentes para poder entrecomillar cuando ya existe una comilla en el componente. Por ejemplo un componente que contiene un entrecomillado doble podr�a ser representado por \"ab o por '"ab'.

Un nombre mixto puede estar vac�o; es decir, contener cero componentes. Un nombre mixto vac�o se representa por un string vac�o.

Un nombre de componente mixto puedo estar vac�o; es decir, contiene un string vac�o. Un separador de componente inicial (el nombre mixto empieza con un separador) denota un inicio de componente vac�o. Un separador de componente final (el nombre mixto termina con un separador) denota una parte final de componente vac�a. Separadores de componentes adyacentes denotan un componente vac�o. Aqu� tenemos algunos ejemplos.

/abc
abc/
abc//xyz

.�La Clase CompositeName

La clase CompositeName es la forma estructural de un nombre mixto. El constructor acepta una representaci�n string de un nombre mixto y lo divide en componentes de acuerdo a la s�ntaxis de nombres mixtos.

Aqu� hay un ejemplo que usa el constructor para dividir un nombre mixto e imprimir sus componentes.

String name = // Composite name to parse
try {
    CompositeName cn = new CompositeName(name);
    System.out.println(cn + " has " + cn.size() + " components: ");
    for (int i = 0; i < cn.size(); i++) {
	System.out.println(cn.get(i));
    }
} catch (InvalidNameException e) {
    System.out.println("Cannot parse name: " + name);
}

Al ejecutar este ejemplo con la entrada a/b/c se produce esta salida.

a/b/c has 3 components.
a
b
c

La clase CompositeName contiene m�todos para acceder a componentes, para moficar un CompositeName, para comparar dos CompositeNames, y para obtener la representaci�n string de un CompositeName.

.�Acceder a los Componentes de un Nombre Mixto

Aqu� est�n los m�todos que podemos usar para acceder a los componentes de un nombre compuesto.

Para recuperar el componente en una posici�n particular dentro de un CompositeName, usamos get(). El ejemplo del constructor anterior mostraba un ejemplo de este uso.

getAll() devuelve todos los componentes de un CompositeName como una enumeration. Nos moveremos por la enumeration para obtener cada componente. El ejemplo del constructor se pude reescribir usando una enumeration, como se ve aqu�.

try {
    CompositeName cn = new CompositeName(name);
    System.out.println(cn + " has " + cn.size() + " components: ");
    for (Enumeration all = cn.getAll(); all.hasMoreElements();) {
	System.out.println(all.nextElement());
    }
} catch (InvalidNameException e) {
    System.out.println("Cannot parse name: " + name);
}

Tambi�n podemos obtener el sufijo o el prefijo de un CompositeName como un ejemplar de CompositeName. Aqu� hay un ejemplo que obtiene los sufijos y prefijos de un nombre mixto.

CompositeName cn = new CompositeName("one/two/three");
Name suffix = cn.getSuffix(1);  // 1 <= index < cn.size()
Name prefix = cn.getPrefix(1);  // 0 <= index < 1

Cuando ejecutamos este programa, genera la siguiente salida.

two/three
one

Para hacer una copia de un CompositeName, usamos clone().

.�Modificar un Nombre Mixto

Aqu� est�n los m�todos que podemos usar para modificar un nombre mixto.

Despu�s de crear un ejemplar de CompositeName, podemos a�adirle o eliminarle componentes. Aqu� hay un ejemplo que a�ade un CompositeName a otro ya existente, a�ade componentes al principio y al final y elimina el segundo componente.

CompositeName cn = new CompositeName("1/2/3");
CompositeName cn2 = new CompositeName("4/5/6");
System.out.println(cn.addAll(cn2));           // 1/2/3/4/5/6
System.out.println(cn.add(0, "abc"));         // abc/1/2/3/4/5/6
System.out.println(cn.add("xyz"));            // abc/1/2/3/4/5/6/xyz
System.out.println(cn.remove(1));             // 1
System.out.println(cn);			      // abc/2/3/4/5/6/xyz

.�Comparar un Nombre Mixto

Aqu� est�n los m�todos que podemo usar para comparar dos nombres mixtos.

Podemos usar compareTo() para ordenar una lista de ejemplares de CompositeName. Aqu� hay un ejemplo que usa compareTo() para implementar el algoritmo de ordenaci�n de la Burbuja.

private static void sort(CompositeName[] names) {
    int bound = names.length-1;
    CompositeName tmp;

    while (true) {
        int t = -1;
        for (int j=0; j < bound; j++) {
  	    int c = names[j].compareTo(names[j+1]);
	    if (c > 0) {
		tmp = names[j];
		names[j] = names[j+1];
		names[j+1] = tmp;
		t = j;
	    }
        }
        if (t == -1) break;
	bound = t;
    }
}

equals() nos permite determinar si dos CompositeNames son sint�cticamene iguales. Dos CompositeNames son iguales si ambos tienen los mismos componentes (exactos, incluidas may�sculas y min�sculas) y en el mismo orden.

Con startsWith() y endsWith(), podemos aprender si un CompositeName empieza o terminar con otro CompositeName; es decir, si un CompositeName es un sufijo o un prefijo de otro CompositeName.

El m�todo de conveniencia isEmpty() nos permite determinar si un CompositeName tiene cero componentes. Tambi�n podemos usar la expresi�n size() == 0 para realizar el mismo chequeo.

Aqu� tenemos ejemplos que usan alguos de estos m�todos de comparaci�n.

CompositeName one = new CompositeName("cn=fs/o=JNDITutorial/tmp/a/b/c");
CompositeName two = new CompositeName("tmp/a/b/c");
CompositeName three = new CompositeName("cn=fs/o=JNDITutorial");
CompositeName four = new CompositeName();

System.out.println(one.equals(two)); 	    // false
System.out.println(one.startsWith(three));  // true
System.out.println(one.endsWith(two));      // true
System.out.println(one.startsWith(four));   // true
System.out.println(one.endsWith(four));     // true
System.out.println(one.endsWith(three));    // false
System.out.println(one.isEmpty());	    // false
System.out.println(four.isEmpty());	    // true
System.out.println(four.size() == 0);	    // true

.�Obtener la Representaci�n String

Aqu� tenemos el m�todo que podemos usar para obtener la representaci�n string de un nombre mixto.

toString()

Cuando usamos el constructor de CompositeName, le suministramos una representaci�n string de un nombre mixto y nos devuelve un ejemplar de CompositeName.

Para hacer la inversa, es decir, para obtener la representaci�n string de un ejemplar CompositeName, usamos toString(). El resultado de este m�todo se puede volver a enviar al constructor para producir un nuevo ejemplar de CompositeName igual al original. Aqu� tenemos un ejemplo.

CompositeName cn = new CompositeName(name);
String str = cn.toString();
System.out.println(str);
CompositeName cn2 = new CompositeName(str);
System.out.println(cn.equals(cn2));		// true

.�CompositeName como argumento para M�todos de Context

Un ejemplar de CompositeName pasado como argumento a los m�todos de los interfaces Context y DirContext es tratado como un nombre mixto. Aqu� tenemos un ejemplo que localiza un objeto creando primero un ejemplar de CompositeName que representa su nombre.

// Create the initial context
Context ctx = new InitialContext(env);
	
// Parse the string name into a CompositeName
Name cname = new CompositeName(
    "cn=homedir,cn=Jon Ruiz,ou=people/tutorial/report.txt");

// Perform the lookup using the CompositeName
File f = (File) ctx.lookup(cname);

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO